<?php

/**
 * Access Control List (ACL)
 * 
 * Список ролей, ресурсов и прав доступа
 * Дальше скармливается плагину Lord_Plugin_Acl
 * 
 * @author Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */

class Acl extends Zend_Acl 
{
    static private $instance;
	static private $role;

/*------------------------------------------------------------------------------*/

	static public function getInstance() 
	{    
		if (self::$instance == NULL) 
		{
			self::$instance = new self();
		}
		return self::$instance;
	}
 
/*------------------------------------------------------------------------------*/
	
	public function __construct() 
	{
		$model = new User();
		
		/**
		* добавляем ресурсы
		*/
		// получаем ресурсы
		$resources = $model->getResources();
		// добавляем первичные ресутсы
		foreach($resources as $mod)
		{
			// если такой ресурс еще не добавлен
			if(false == $this->has($mod['module'].'_'.$mod['controller']))
			{
				// добавляем
				$this->add(new Zend_Acl_Resource($mod['module'].'_'.$mod['controller'])); 				
			}
		} 

		/**
		* добавляем роли пользователей		
		* и сразу проставляем им разрешения
		*/		
        /*
		// достаем роли
		$roles = $model->getRoles();
		// для каждой роли
		foreach($roles as $role)
		{
			// производим добавление
			$this->addRole(new Zend_Acl_Role($role['name']));
			// достаем доступные для этой роли ресурсы
			$permissions = $model->getRoleResources($role['id']); 
			// проставляем разрешения на эти ресурсы
			foreach($permissions as $perm)
			{
					$this->allow( $role['name'], 
								  $perm['module'].'_'.$perm['controller'], 
								  $perm['action']);
			}
		} 
        */
        
        // для ускорения производительности попробуем достать ресурсы только для текущей роли

        $auth = Zend_Auth::getInstance();     
        // если есть какой-то пользователь в хранилище сессии
        if ($auth->hasIdentity() == true) 
        {
            // получаем данные этого пользователя 
            $user = $auth->getIdentity();  
            $role = $model->getRole($user->role);
            $user->roleName = $role->name;
        } 
        else
        {
            $user->roleName = 'anon';
            $role = $model->getRoleByName($user->roleName); 
            $user->role = $role->id;
        }                     
        // производим добавление
        $this->addRole(new Zend_Acl_Role($user->roleName));
        // достаем доступные для этой роли ресурсы
        $permissions = $model->getRoleResources($user->role); 
        // проставляем разрешения на эти ресурсы
        foreach($permissions as $perm)
        {
                $this->allow( $user->roleName, 
                              $perm['module'].'_'.$perm['controller'], 
                              $perm['action']);
        }
        return;
	}
/*------------------------------------------------------------------------------*/
}

?>
